(function () {
    // don't emit events from inside the previews themselves
    if (window.location.search.match(/receiver/gi)) {
        return;
    }
    var multiplex = Reveal.getConfig().multiplex;

    var socket = io.connect(multiplex.url);

    var notify = function (slideElement, indexh, indexv, origin) {
        if (typeof origin === 'undefined' && origin !== 'remote') {
            var nextindexh;
            var nextindexv;

            var fragmentindex = Reveal.getIndices().f;
            if (typeof fragmentindex == 'undefined') {
                fragmentindex = 0;
            }

            if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
                nextindexh = indexh;
                nextindexv = indexv + 1;
            } else {
                nextindexh = indexh + 1;
                nextindexv = 0;
            }

            var slideData = {
                indexh: indexh,
                indexv: indexv,
                indexf: fragmentindex,
                nextindexh: nextindexh,
                nextindexv: nextindexv,
                secret: multiplex.secret,
                socketId: multiplex.id
            };

            socket.emit('slidechanged', slideData);
        }
    }

    Reveal.addEventListener('slidechanged', function (event) {
        notify(event.currentSlide, event.indexh, event.indexv, event.origin);
    });

    var fragmentNotify = function (event) {
        notify(Reveal.getCurrentSlide(), Reveal.getIndices().h, Reveal.getIndices().v, event.origin);
    };

    Reveal.addEventListener('fragmentshown', fragmentNotify);
    Reveal.addEventListener('fragmenthidden', fragmentNotify);
}());